package com.zdp.leetcodeMiddle;


import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/*
* 题目描述：
* 给你一个整数数组 nums ，数组中的元素 互不相同 。返回该数组所有可能的子集（幂集）。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1：
输入：nums = [1,2,3]
输出：[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2：
输入：nums = [0]
输出：[[],[0]]
提示：
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同
来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/subsets
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */
public class 子集_78 {
    public static void main(String[] args) {
        子集_78 demo = new 子集_78();
        List<List<Integer>> subsets = demo.subsets(new int[]{
                1, 2, 3
        });
        for(List<Integer> temp: subsets) {
            System.out.println(temp.toString());
        }
    }


    /*
    * 解题思路： 利用深搜 来获取到所有的可能性
    * 因为不能包含重复的子集，所以 使用过的元素 接下来就不能再使用了
    * 所以 for(int i = index+1;)  比如 nums = 1,2,3
    * 一开始 我是搜索所有第一个元素为1 的子集。 搜索完毕后
    * 接下来搜索所有第一个元素为2 的子集。这些第一个元素为2的子集，显然是不能包含1的。
    * 因为之前 的搜索已经将所有含1的可能子集都搜索完毕了。
    * */
    private List<List<Integer>> result = new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
        ArrayList<Integer> temp = new ArrayList<>();
        result.add(temp);
        for(int i =0;i<nums.length;i++){
            temp.add(nums[i]);
            result.add((ArrayList<Integer>)temp.clone());
            f(nums,temp,1,i+1);
            temp.remove(temp.size()-1);
        }
        return result;
    }

    public void f(int[] nums, ArrayList<Integer> temp,
                  int count,int index){
        if(count > nums.length){
            return ;
        }
        for(int i=index;i<nums.length;i++){
            temp.add(nums[i]);
            result.add((ArrayList<Integer>)temp.clone());
            f(nums,temp,count+1,i+1);
            temp.remove(temp.size()-1);
        }
    }
}
